مساله ضرب زنجیرهای ماتریسها و پرانتزبندی بهینه آن یکی از مثالهای مشهور کاربرد برنامهنویسی پویا در حل مسائل بهینهسازی است.
فرض کنید قصد داریم حاصلضرب عبارت ماتریسی A3x7 x B7x8 x C8x4 را محاسبه کنیم. میدانیم که ضرب ماتریسها خاصیت شرکتپذیری داشته، اما خاصیت جابجایی ندارد. بنابراین رعایت ترتیب ضرب آنها مهم است. پرانتزبندیهای مختلف ضرب ماتریسها حالتهای مختلف محاسبه آن را به ما میدهند:
(1: A x ( B x C
2: ( A x B ) x C
در حالت اول ابتدا B در C ضرب شده و سپس حاصل آنها در A ضرب میشود؛ و در حالت دوم ابتدا A و B در هم ضرب شده و سپس نتیجه در C ضرب میشود. حال سوال این است که آیا این پرانتزبندیها تفاوتی با هم دارند؟
ضرب ماتریس دلخواه MR x L در ماتریس دلخواه دیگری مانند NL x C به R x L x C عمل ضرب عددی نیاز دارد (چرا؟). با توجه به این موضوع، تعداد کل عملهای ضرب برای محاسبه حاصلضرب سه ماتریس فوق را در هر دو پرانتزبندی محاسبه میکنیم:
1: A x ( B x C ) : 7 x 8 x 4 + 3 x 7 x 4 = 308
در حالت اول ابتدا ماتریس B در C ضرب میشود. سپس ماتریس A و ماتریس حاصل از ضرب اول، با ابعاد ( 4 ,7 )، در هم ضرب میشوند. به همین ترتیب در مورد حالت دوم:
2: ( A x B ) x C : 3 x 7 x 8 + 3 x 8 x 4 = 264
پس در پرانتزبندی به فرم دوم تعداد ضرب کمتری نیاز است.
هدف ما این است که در بین تمامی این حالتها، حالتی را بیابیم که حاصلضرب ماتریسها با حداقل ضرب عددی محاسبه شود.
برای دریافت پروژه اینجا کلیک کنید
سورس کامل پروژه در ویژوال بیسیک دات نت به همراه فایل اجرایی | محتوای اصلی |
---|---|
شامل 50 صفحه داکیومنت تایپ شده به صورت فایل ورد حاوی مقدمه، تاریخچه و توضیحات خط به خط پروژه و... می باشد | داکیومنت |
یک فایل آموزشی شامل نحوه اجرای پروژه، نحوه دسترسی به سورس کد پروژه و طریقه باز کردن پایگاه داده و مشاهده جداول می باشد که به صورت رایگان ارائه می گردد | روش اجرا |